#include <iostream>
using namespace std;

//  拷贝构造函数的调用时机
// 1. 使用一个已经创建完毕的对象来初始化一个新对象
// 2. 值传递的方式给函数参数传值
// 3. 值方式返回局部变量

// 构造函数的调用规则:
// 1. 如果只定义了有参构造函数 , c++ 不会提供默认无参构造函数 ， 但会提供 拷贝默认构造函数
// 2. 如果只定义了构造函数 ， C++不在提供其他构造函数


class Person {
public:
    Person() {
        cout << "Person() 的默认构造函数调用" << endl;
    }
    Person(int age) {
        m_age = age;
        cout << "Person(int age) 构造函数调用" << "\t" << m_age << endl;
    }
    Person(const Person & p) {
        m_age = p.m_age;
        cout << "Person(const Person & p) 拷贝构造函数调用" << "\t" << m_age << endl;
    }
    ~Person() {
        cout << "~Person() 析构函数调用" << endl;
    }

    int m_age;
};

// 1. 使用一个已经创建完毕的对象来初始化一个新对象
void test01() {
    Person p1(20);
    Person p2(p1);

    cout << "p2的年龄为：" << p2.m_age << endl;
}

// 2.  值传递的方式给函数参数传值
void doWork(Person p) {
    cout << "doWork() 函数调用" << endl;
}
void test02() {
    Person p;
    doWork(p);
}

// 3. 值方式返回局部变量
Person doWork2() {
    Person p1;
    cout << "函数内部即将返回局部对象"  << "\t" << (int*) &p1 << endl;
    return p1; // 返回局部对象会触发拷贝构造函数创建临时对象
}
void test03() {
    Person p = doWork2(); // 此处实际调用一次拷贝构造函数（可能被编译器优化）
    cout << "test03 中的 Person 对象创建完成" << "\t" << (int*) &p << endl;
}

int main() {
    //test01();
    //test02();
    test03();

    return 0;
}